
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

class DATA_PROCESSING():
    def Eda(self):
        # 1.数据加载（5分）
        # 要求：读取 乳腺癌原始数据.xlsx文件到DataFrame中。
        df = pd.read_excel('乳腺癌原始数据.xlsx')

        # 2. 检查数据情况（5分）
        # 检查数据的基本情况，包括但不限于总行数、列名、空值统计。
        print(df.shape)
        print(df.columns)
        print(df.isnull().sum())
        print(df.info())
        # 3. 肿块分布（5分）
        # 要求：统计每个肿块形状分布，并绘制直方图展示成绩分布情况。
        # plt.hist(df['肿块形状'])
        # plt.show()

        # 4. 出勤率分析（5分）
        # 要求：按肿块形状统计病人个数，并找肿块最多的前3个肿块个数。
        r4 = df.groupby('肿块形状').agg({'肿块边缘': 'count'}).sort_values(by='肿块边缘',ascending=False).reset_index().head(3)
        print(r4)




        # 5. 病人年龄和肿块形状个数的关系（5分）
        # 要求：绘制散点图展示个个年龄段和肿块形状个数之间的关系。
        fd = [0,20,40,60,80,100]
        df['年龄段'] = pd.cut(df['年龄'],fd,labels=['0-20','20-40','40-60','60-80','80-100'])
        r5 = df.groupby('年龄段')['肿块形状'].count().reset_index()
        plt.scatter(r5['年龄段'],r5['肿块形状'])
        plt.show()





        # 6. 肿块形状和肿块密度比（5分）
        # 要求：新增一列[形状密度比]计算每个病人肿块形状和肿块密度的比（肿块形状/肿块密度）。
        df['形状密度比'] = df['肿块形状'] / df['肿块密度']
        print(df.head(5))

        # 7. 病人与肿块形状分布（5分）
        # 要求：按肿块形状个数统计每个病人的个数，并找哪个肿块形状的病人最多。
        r7 = df.groupby('肿块形状').agg({'肿块密度': 'count'}).sort_values(by='肿块密度',ascending=False).reset_index().head(1)
        print(r7)

        # 8. 年龄与BIRADS等级的病人个数（5分）
        # 要求：按性病人年龄和BIRADS等级，统计病人个数。
        r8 = df.groupby(['年龄', 'BIRADS等级']).agg({'肿块密度': 'count'}).reset_index()
        print(r8)

        # 9. BIRADS等级与病人年龄（5分）
        # 要求：按BIRADS等级统计每个等级病人的平均年龄，并绘制折线图展示BIRADS等级与平均年龄的关系。
        r9 = df.groupby('BIRADS等级').agg({'年龄': 'mean'}).reset_index()
        # plt.plot(df['BIRADS等级'],df['年龄'])
        # plt.show()

        # 10. 高于平均年龄人数（5分）
        # 要求：先求出病人平均年龄，再统计出高于平均年龄的病人个数。
        avgMean = df['年龄'].mean()
        print(len(df[df['年龄'] > avgMean]))

        # 11. 病人年龄排名（5分）
        # 要求：对病人年龄进行排序，找出年龄最大的是个3个病人。
        r11 = df.sort_values(by='年龄', ascending=False).reset_index().head(3)
        print(r11)

# 12. DEA工程化（5分）
# 要求：将以上代码进行工程化，封装在DATA_PROCESSING类的def Eda()中，并实现实例化类已经调用Eda实现输出。
if __name__ == '__main__':
    d = DATA_PROCESSING()
    d.Eda()